/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.core.servlets;

import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.naming.InitialContext;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.UserTransaction;
import org.apache.log4j.Logger;
import stud.cp.core.facade.PluginManager;
import stud.cp.core.plugins.PluginRouter;

/**
 * Сервлет, отвечающий за прием запросов от пользователя, их обработку
 * и отправку ответа пользователю.
 * @author Morfant
 */
public class PluginServlet extends HttpServlet {

    /**
     * Менеджер плагинов.
     */
    private PluginManager pluginManager = new PluginManager();
    /**
     * Логгер.
     */
    private Logger logger = Logger.getLogger("ACPII");

    /**
     * Метод, инициализурующий сервлет.
     * @param config Конфигурая сервлета.
     * @throws ServletException Ошибки при инициализации сервлета.
     */
    @Override
    public void init(ServletConfig config) throws ServletException {
        // Инициализируем базовый класс.
        super.init(config);
        // Ресурсы, которые мы будем использовать для того, чтобы координировать дейстивия со страницами.
        ResourceBundle bundle = null;
        String pathToApplictionConfig = "";
        // Пробуем получить ресурсы.
        try {
            // Пытаемся достать ресурсы из параметров инициализации сервлета.
            bundle = ResourceBundle.getBundle(config.getInitParameter("plugin-mappings"));
        } catch (MissingResourceException e) {
            // Если такие данные мы не нашли, то увы.
            logger.debug("Файл ресурсов не найден:", e);
            throw new ServletException(e);
        }
        // Добавляем полученные данные к контексту сервлета.
        getServletContext().setAttribute("plugin-mappings", bundle);
    }

    /**
     * Метод, отвечающий за прием
     * сообщений от пользователя.
     * @param req Реквест.
     * @param res Респонс.
     * @throws java.io.IOException Ошибки ввода вывода.
     * @throws ServletException Ошибки сервлета.
     */
    @Override
    public void service(HttpServletRequest req,
            HttpServletResponse res)
            throws java.io.IOException, ServletException {
        try {
            //TODO::[Low] Think about transactions.
            InitialContext ctx = new InitialContext();
            UserTransaction tx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
            tx.begin();
            PluginRouter router = pluginManager.perform(this, req);
            router.route(this, req, res);
            tx.commit();
        } catch (Exception e) {
            logger.debug("В течении работы приложения произошла ошибка: ", e);
            throw new ServletException(e);
        }
    }
}
